package com.coderside.fragment.String;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 日期格式化工具
 * @author David Day
 */
public final class DateFormatTools {

	/**
	 * 格式化工具集合
	 */
	private static final Map<String, DateFormat> fmtMap = new HashMap<String, DateFormat>();

	/**
	 * @param ex 格式化表达式
	 * @return 格式化工具
	 */
	private static DateFormat getFormat(String ex) {
		DateFormat fmt = fmtMap.get(ex);
		if (fmt == null) {
			fmt = new SimpleDateFormat(ex);
			fmtMap.put(ex, fmt);
		}
		return fmt;
	}

	/**
	 * 格式化日期
	 * @param date 日期
	 * @param ex 表达式
	 * @return 日期字符串
	 */
	public static String format(Date date, String ex) {
		return getFormat(ex).format(date);
	}

	/**
	 * 解析日期
	 * @param source 日期字符串
	 * @param ex 表达式
	 * @return 日期
	 * @throws ParseException
	 */
	public static Date parse(String source, String ex) throws ParseException {
		return getFormat(ex).parse(source);
	}

	public static boolean checkDate(String date) {
		String eL = "^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1][0-9])|([2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$";
		Pattern p = Pattern.compile(eL);
		Matcher m = p.matcher(date);
		boolean b = m.matches();
		if (b) {
			System.out.println("格式正确");
		} else {
			System.out.println("格式错误");
		}
		return b;
	}
}
